前言
Python
中内置了dict
和set
,dict
也就是我们常说的字典
。dict
的最大好处就是取值非常快,给定一个key
,我们可以快速获取到它对应的value
。也正是如此,dict
也被广泛应用在我们的实际开发当中。
set
,顾名思义,也就是集合
,和我们初中学习过的数学知识一样,集合具有确定性
、无序性
、互异性
,回顾一下:
- 确定性
给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现
- 无序性
元素之间没有顺序,都是无序的。
- 互异性
给定一个集合,元素不允许重复,集合中的元素都是不相同的。
dict
初始化
dict
可以使用字面量初始化,例如
1 | dic = {'key1': 'value1', 'key2': 666} |
有趣的是,python
的字典可以是基本数据类型或一些不可变类型:
1 | >>> dic = {'key1': 'value1', 1: 'one', False: 'False', _: '_'} |
但是,要注意的是,当key
为0
时,如果使用False
作为key
添加到字典,则字典的key
还是以0
为准,但是值会覆盖之前的值,当key
为1
时,也是同一个道理,例如:
1 | >>> dic = {1: 'a', 0: 'b'} |
同样地,当key
为True
或False
时,添加1
或0
作为key
添加到字典,仍然是以True
或False
为key
,只是值会被覆盖,例如:
1 | >>> dic = {True: 'a', False: 'b'} |
也就是说,当你的key
为1
时,这时往字典添加True
作为key
时,Python
内部会将你的True
转化为1
,然后判断原来的dic
里面已经有1
,因此key
保持不变,值被覆盖。反之,如果用bool
值作为key
,再往里面添加1
或0
作为key
的时候,Python
内部会转化成bool
值的key
。
添加值
直接通过赋值的方式往字典中添加键值对,比如:
1 | >>> dic = {'key1': 'value1', 'key2': 'value2'} |
判断key是否存在
key in dict
使用key in dict
的形式来判断key
是否存在于字典dict
中,例如:
1 | dic = {'key1': 'value1', 'key2': 'value2'} |
输出:
1 | dic中存在key2 |
dic.get(key)
第二种方法就是通过dic.get(key)
的形式判断,如果key
存在,将返回key
对应的value
,如果key
不存在,则返回None
,也可以指定当key
不存在时,返回特定的值。例如:
1 | dic = {'key1': 'value1', 'key2': 'value2'} |
输出:
1 | ➜ Desktop python3 demo.py |
删除元素
字典的删除元素方法和数组是类似的,直接使用pop(key)
的形式,pop(key)
删除并返回所删除的key
对应的value
,但是如果key
不存在就会报错:
1 | >>> dic = {'a': 1, 'b': 2} |
特点
- 查找速度快(以空间换时间)
- 占用空间大,浪费内存较多
- key必须是不可变对象
为什么要求key
是不可变,引用廖雪峰的官方网站的描述就是:
因为
dict
根据key
来计算value
的存储位置,如果每次计算相同的key
得出的结果不同,那dict
内部就完全混乱了。这个通过key
计算位置的算法称为哈希算法(Hash
)。
要保证hash
的正确性,作为key
的对象就不能变。在Python
中,字符串、整数等都是不可变的,因此,可以放心地作为key
。比如,list
是可变的,就不能作为key
。
set
创建集合
在Python
中,创建集合需要一个list
数组作为数组,这一点很有趣:
1 | >>> mySet = set([1, 2, 3]) |
添加元素
使用add(key)
的形式来添加元素到集合中
1 | >>> mySet = set([1, 2, 3]) |
删除元素
使用remove(key)
的形式直接删除元素
1 | >>> mySet = set([1, 2, 3]) |
交集
使用&
符号求两个集合的交集
1 | >>> mySet = set([1,2,3]) |
并集
使用|
符号求两个集合的并集
1 | >>> mySet = set([1,2,3]) |
注意:
set
和dict
的唯一区别是没有存储对应的value
,因为集合具有互异性,为了保证没有重复的元素,因此集合内不可以添加不可变对象。
小结
dict
和set
的key
必须不可变,因为要保证可哈希- 通常情况下,建议使用
str
作为dict
的key